//
// Created by xsh on 2025/6/4.
//
#ifndef MIDI_MESSAGE_H
#define MIDI_MESSAGE_H

#include <vector>
#include <cstdint>

class MidiMessage {
public:
    // MIDI 消息类型常量
    static const uint8_t NOTE_ON        = 0x90;
    static const uint8_t NOTE_OFF       = 0x80;
    static const uint8_t CONTROL_CHANGE = 0xB0;
    static const uint8_t PROGRAM_CHANGE = 0xC0;
    static const uint8_t PITCH_BEND     = 0xE0;

    // 构造函数
    MidiMessage(const std::vector<uint8_t>& data, uint64_t timestamp = 0);
    MidiMessage(const uint8_t* data, size_t length, uint64_t timestamp = 0);

    // 获取原始数据
    const std::vector<uint8_t>& getData() const;

    // 获取时间戳（单位取决于音频引擎，如样本数或纳秒）
    uint64_t getTimestamp() const;

    // 获取状态字节
    uint8_t getStatusByte() const;

    // 获取通道（0~15）
    uint8_t getChannel() const;

    // 获取音高（0~127）
    uint8_t getPitch() const;

    // 获取力度（0~127）
    uint8_t getVelocity() const;

    // 是否是 Note On
    bool isNoteOn() const;

    // 是否是 Note Off（包括 Note On with velocity == 0）
    bool isNoteOff() const;

    // 是否是控制器变化
    bool isControlChange() const;

    // 是否是音色切换
    bool isProgramChange() const;

    // 是否是弯音轮
    bool isPitchBend() const;

private:
    std::vector<uint8_t> mData;
    uint64_t mTimestamp;
};

#endif // MIDI_MESSAGE_H